#include "DisponibilidadHorariaDiaria.h"

using namespace modelo;

DisponibilidadHorariaDiaria::DisponibilidadHorariaDiaria(string dia, string horario)
{
	this->dia = this->ObtenerDia(dia);
	this->rangosHorarios = this->ObtenerRangosHorarios(horario);
};

Dia DisponibilidadHorariaDiaria::ObtenerDia(string dia)
{
	for (int i = 0; i < dia.length(); i++)
		dia[i]=toupper(dia[i]);
	if(dia == "LUNES") 
		return Dia::Lunes;
	if(dia == "MARTES") 
		return Dia::Martes;
	if(dia == "MIERCOLES") 
		return Dia::Miercoles;
	if(dia == "JUEVES") 
		return Dia::Jueves;
	if(dia == "VIERNES") 
		return Dia::Viernes;
	if(dia == "SABADO") 
		return Dia::Sabado;
	if(dia == "DOMINGO") 
		return Dia::Domingo;
};

list<RangoHorario*> DisponibilidadHorariaDiaria::ObtenerRangosHorarios(string hora)
{
	list<RangoHorario*> nuevosRangosHorarios;
	int cantidadSeparadores = this->ObtenerCantidadSeparadores(hora);
	int posSeparador = -1;
	for(int separadorActual = 0; separadorActual <= cantidadSeparadores; separadorActual++)
	{
		int posSeparadorAnterior = posSeparador;
		posSeparador = hora.find(',',posSeparador + 1);
		if(posSeparador == -1)
		{
			posSeparador = hora.length();
		}
		RangoHorario* unRango = this->ObtenerRango(hora.substr(posSeparadorAnterior + 1, posSeparador));
		nuevosRangosHorarios.push_back(unRango);
	}
	return nuevosRangosHorarios;
};

RangoHorario* DisponibilidadHorariaDiaria::ObtenerRango(string horario)
{
	int posSeparador = horario.find('-', 0);
	string horaDesdeStr = horario.substr(0,posSeparador);
	string horaHastaStr = horario.substr(posSeparador + 1, horario.length());
			
	int posSeparadorDesde = horaDesdeStr.find(':',0);
	int posSeparadorHasta = horaHastaStr.find(':',0);

	Hora horaDesde, horaHasta;
	horaDesde.horas = atoi(horaDesdeStr.substr(0,posSeparadorDesde).c_str());
	horaDesde.minutos = atoi(horaDesdeStr.substr(posSeparadorDesde + 1,horaDesdeStr.length()).c_str());
	horaHasta.horas = atoi(horaHastaStr.substr(0,posSeparadorHasta).c_str());
	horaHasta.minutos = atoi(horaHastaStr.substr(posSeparadorHasta + 1,horaHastaStr.length()).c_str());
	RangoHorario* unRango = new RangoHorario(horaDesde, horaHasta);
	return unRango;
};

int DisponibilidadHorariaDiaria::ObtenerCantidadSeparadores(string hora)
{
	int contador = 0;
	for(int aux = 0; aux < hora.size(); aux++)
		if(hora[aux] == ',')
			contador++;
	return contador;
};

bool DisponibilidadHorariaDiaria::Contiene(DiaCursadaMateria* diaCursada)
{
	bool coincideDia = this->dia == diaCursada->GetDiaDeLaSemana();
	bool rangoHorarioContenido = false;
	list<RangoHorario*>::iterator itRangoHorario;
	for(itRangoHorario = this->rangosHorarios.begin(); itRangoHorario != this->rangosHorarios.end(); itRangoHorario++)
	{
		if((*itRangoHorario)->Contiene(diaCursada->GetRangoHorario())) 
		{
			rangoHorarioContenido = true;
			break;
		}
	}
	return coincideDia && rangoHorarioContenido;
};